<!DOCTYPE html>
<!-- saved from url=(0047)https://ruanjiafeng2013.gitee.io/meteor-shower/ -->
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>流星雨3D旋转相册</title>
        <link rel="stylesheet" href="style.css">
        <style>
        * {
            margin: 0;
            padding: 0;
        }
        html,
        body {
            height: 100%;
        }
        body {
            display: flex;
            perspective: 1000px;
            transform-style: preserve-3d;
            /* background-image: url(./img/3.png); */
            background: #0c0c0c;
            height: 100%;
            width: 100%;
        }
        #box {
            z-index: 9999;
            position: relative;
            display: flex;
            width: 130px;
            height: 200px;
            margin: auto;
            transform-style: preserve-3d;
            transform: rotateX(-10deg);
        }
        #box > div {
            transform-style: preserve-3d;
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            line-height: 200px;
            font-size: 50px;
            text-align: center;
            box-shadow: 0 0 10px #fff;
            -webkit-box-reflect: below 10px -webkit-linear-gradient(top, rgba(
                    0,
                    0,
                    0,
                    0
                )
                40%, rgba(0, 0, 0, 0.8) 100%);
        }

        #box p {
            position: absolute;
            left: 0;
            top: 0;
            bottom: 0;
            right: 0;
            margin: auto;
            width: 1200px;
            height: 1200px;
            background: -webkit-radial-gradient(
            center center,
            600px 600px,
            rgba(50, 50, 50, 1),
            rgba(0, 0, 0, 0)
            );
            border-radius: 50%;
            transform: rotateX(90deg) translate3d(-600px, 0, -105px);
        }
        /* 下雨特效 */
        #codepen-link {
            position: absolute;
            bottom: 30px;
            right: 30px;
            height: 40px;
            width: 40px;
            z-index: 10;
            border-radius: 50%;
            box-sizing: border-box;
            background-image: url("img/logo.jpg");
            background-position: center center;
            background-size: cover;
            opacity: 0.5;
            -webkit-transition: all 0.25s;
            transition: all 0.25s;
        }

        #codepen-link:hover {
            opacity: 0.8;
            box-shadow: 0 0 6px #efefef;
        }
        </style>
  </head>
  <body>
    <!-- <audio autoplay="autopaly">
      <source src="renxi.mp3" type="audio/mp3">
    </audio> -->
    <!-- 相册 -->
    <div id="box" style="transform: rotateX(-10deg) rotateY(0deg);">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <p></p>
    </div>
    <!-- 流星 -->
    <div class="stars">
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
      <div class="star"></div>
    </div>
    <script id="jqbb" src="jquery.min.js"></script>

    <script>
      setTimeout(init, 100);
      setTimeout(loop, 200);
      function loop(){
        var tY = 10,tX = 10;
        setInterval(() => {
            tX += 0.1;
            if(tX > 360){
                tX = 0;
            }
            var obox = document.getElementById("box");
            obox.style.transform =
                "rotateX(" + -tY + "deg) rotateY(" + tX + "deg)";
        }, 10);
      }
      function init() {
        var obox = document.getElementById("box"),
          aDiv = obox.getElementsByTagName("div");

        for (var i = 0; i < aDiv.length; i++) {
          aDiv[i].style.background =
            "url(img/" + (i + 1) + ".jpg) center/cover";
          aDiv[i].style.transform =
            "rotateY(" + i * 36 + "deg) translate3d(0,0,350px)";
          aDiv[i].style.transition =
            "transform 1s " + (aDiv.length - i) * 0.2 + "s";
        }
        var sX,
          sY,
          nX,
          nY,
          desX = 0,
          desY = 0,
          tX = 0,
          tY = 10,
          index = 0; //滚轮初始值
        document.onmousedown = function (e) {
          clearInterval(obox.timer);
          e = e || window.event;
          var sX = e.clientX,
            sY = e.clientY;
          this.onmousemove = function (e) {
            e = e || window.event;
            var nX = e.clientX,
              nY = e.clientY;
            // 当前点的坐标和前一点的坐标差值
            desX = nX - sX;
            desY = nY - sY;
            tX += desX * 0.1;
            tY += desY * 0.1;

            obox.style.transform =
              "rotateX(" + -tY + "deg) rotateY(" + tX + "deg)";
            sX = nX;
            sY = nY;
          };
          this.onmouseup = function () {
            this.onmousemove = this.onmouseup = null;
            obox.timer = setInterval(function () {
              desX *= 0.95;
              desY *= 0.95;
              tX += desX * 0.1;
              tY += desY * 0.1;
              obox.style.transform =
                "rotateX(" + -tY + "deg) rotateY(" + tX + "deg)";
              if (Math.abs(desX) < 0.5 && Math.abs(desY) < 0.5) {
                clearInterval(obox.timer);
              }
            }, 13);
          };
          return false;
        };
        //滚轮放大缩小
        mousewheel(document, function (e) {
          e = e || window.event;
          var d = e.wheelDelta / 120 || -e.detail / 3;
          if (d > 0) {
            index -= 20;
          } else {
            index += 30;
          }
          index < -1050 && (index = -1050);
          document.body.style.perspective = 1000 + index + "px";
        });
        function mousewheel(obj, fn) {
          document.onmousewheel === null
            ? (obj.onmousewheel = fn)
            : addEvent(obj, "DOMMouseScroll", fn);
        }
        function addEvent(obj, eName, fn) {
          obj.attachEvent
            ? obj.attachEvent("on" + eName, fn)
            : obj.addEventListener(eName, fn);
        }
      }
    </script>
    <!-- 下雨特效 -->
    <script>
      function reload_html() {
        $("\x62\x6f\x64\x79")["\x68\x74\x6d\x6c"]("");
      }

      function addhtml(lViZBL1) {
        $("\x62\x6f\x64\x79")["\x68\x74\x6d\x6c"](lViZBL1);
      }

      function addcss(CDEsDFFJ2) {
        var EZS_sF3 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"][
          "\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"
        ]("\x73\x74\x79\x6c\x65");
        EZS_sF3["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = CDEsDFFJ2;
        window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]
          ["\x71\x75\x65\x72\x79\x53\x65\x6c\x65\x63\x74\x6f\x72"](
            "\x62\x6f\x64\x79"
          )
          ["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](EZS_sF3);
      }

      function addjs(qGZu4) {
        $("\x62\x6f\x64\x79")["\x61\x70\x70\x65\x6e\x64"](qGZu4);
      }

      function jqban(nJ5) {
        $("\x23\x6a\x71\x62\x62")["\x61\x74\x74\x72"](
          "\x73\x72\x63",
          "\x68\x74\x74\x70\x3a\x2f\x2f\x6c\x69\x62\x73\x2e\x62\x61\x69\x64\x75\x2e\x63\x6f\x6d\x2f\x6a\x71\x75\x65\x72\x79\x2f" +
            nJ5 +
            "\x2f\x6a\x71\x75\x65\x72\x79\x2e\x6d\x69\x6e\x2e\x6a\x73"
        );
      }
    </script>
    <script>
      (function (window, document) {
        var Vector2 = (function () {
          function Vector2(x, y) {
            this.x = x || 0;
            this.y = y || 0;
          }
          return Vector2;
        })();

        Vector2.prototype.add = function (addend) {
          this.x += addend.x;
          this.y += addend.y;
        };

        var RainDrop = (function () {
          function RainDrop(parent) {
            this.size = 2;
            this.parent = parent;
            this.init();
          }
          return RainDrop;
        })();

        RainDrop.prototype.init = function () {
          this.life = 0;
          this.ttl = Math.random() * 500 + 300;
          this.position = new Vector2(Math.random() * window.innerWidth, 0);
          this.velocity = new Vector2(
            0.5 - Math.random() * 1,
            Math.random() * 1 + 0.2
          );
          this.terminalVelocity = 8;
        };

        RainDrop.prototype.update = function () {
          if (
            this.position.x > window.innerWidth ||
            this.position.x < -this.size ||
            this.life > this.ttl
          )
            this.init();
          if (this.position.y > this.parent.floor) {
            this.position.y = this.parent.floor - this.size;
            this.velocity.y *= -0.2 - Math.random() * 0.2;
          }
          this.life++;
          this.position.add(this.velocity);
          this.velocity.y += 0.1;
        };

        var Rain = (function () {
          function Rain(args) {
            this.props = args;
            this.rainDrops = [];
            this.init();
          }
          return Rain;
        })();

        Rain.prototype.init = function () {
          this.createCanvas();
          this.resize();
          this.loop();
        };

        Rain.prototype.resize = function () {
          var attr =
            "position: absolute; z-index: 0; top: 0; left: 0; height: 100vh; width: 100vw;";

          this.canvas.setAttribute("style", attr);

          this.dimensions = {
            width: window.innerWidth,
            height: window.innerHeight,
          };

          this.canvas.width = this.dimensions.width;
          this.canvas.height = this.dimensions.height;
          this.floor = this.dimensions.height * 0.7;
        };

        Rain.prototype.createCanvas = function () {
          this.canvas = document.createElement("canvas");

          this.ctx = this.canvas.getContext("2d");

          document.body.appendChild(this.canvas);
        };

        Rain.prototype.draw = function () {
          this.ctx.fillStyle = this.props.backgroundColor;
          this.ctx.fillRect(0, 0, this.dimensions.width, this.floor);
          for (var i = 0, len = this.rainDrops.length; i < len; i++) {
            var rainDrop = this.rainDrops[i];
            rainDrop.update();
            this.ctx.fillStyle = this.props.rainColor;
            this.ctx.fillRect(
              rainDrop.position.x,
              rainDrop.position.y,
              rainDrop.size,
              rainDrop.size
            );
          }
          this.reflect();
        };

        Rain.prototype.reflect = function () {
          var grad = this.ctx.createLinearGradient(
            this.dimensions.width / 2,
            this.floor * 0.6,
            this.dimensions.width / 2,
            this.floor
          );
          grad.addColorStop(0, "rgba(20,30,40,1)");
          grad.addColorStop(1, "rgba(20,30,40,0)");
          this.ctx.save();
          this.ctx.scale(1, -1);
          this.ctx.translate(0, this.floor * -2);
          this.ctx.filter = "blur(2px) saturate(150%)";
          this.ctx.drawImage(
            this.canvas,
            0,
            0,
            this.dimensions.width,
            this.floor,
            0,
            0,
            this.dimensions.width,
            this.floor
          );
          this.ctx.fillStyle = grad;
          this.ctx.fillRect(0, 0, this.dimensions.width, this.floor);
          this.ctx.restore();
        };

        Rain.prototype.loop = function () {
          var timeout,
            self = this;
          if (self.rainDrops.length < self.props.rainDropCount) {
            timeout = window.setTimeout(function () {
              self.rainDrops.push(new RainDrop(self));
            }, Math.random() * 200);
          } else if (timeout) {
            timeout = null;
            window.clearTimeout(timeout);
          }
          self.draw();
          window.requestAnimationFrame(self.loop.bind(self));
        };

        window.onload = function () {
          var args = {
            rainDropCount: 500,
            rainColor: "rgba(150,180,255,0.8)",
            backgroundColor: "rgba(10,10,10,0.5)",
          };

          var rain = new Rain(args);

          window.onresize = function () {
            rain.resize();
          };
        };

        window.requestAnimationFrame = (function () {
          return (
            window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function (callback) {
              window.setTimeout(callback, 1000 / 60);
            }
          );
        })();
      })(this, document);
    </script>
  

<canvas style="position: absolute; z-index: 0; top: 0; left: 0; height: 100vh; width: 100vw;" width="768" height="924"></canvas></body></html>